package com.cb2.algorithm.leetcode;

/**
 * <a href="https://leetcode.cn/problems/middle-of-the-linked-list">链表的中间结点(Middle of the Linked List)</a>
 * <p>给你单链表的头结点 head ，请你找出并返回链表的中间结点。如果有两个中间结点，则返回第二个中间结点。</p>
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：head = [1,2,3,4,5]
 *      输出：[3,4,5]
 *      解释：链表只有一个中间结点，值为 3 。
 *
 * 示例 2：
 *      输入：head = [1,2,3,4,5,6]
 *      输出：[4,5,6]
 *      解释：该链表有两个中间结点，值分别为 3 和 4 ，返回第二个结点。
 * </pre>
 * </p>
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>链表的结点数范围是 [1, 100]</li>
 *     <li>1 <= Node.val <= 100</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2023/5/10 11:29
 */
public class LC0876MiddleOfLinkedList_S {
    static class Solution {
        public ListNode middleNode(ListNode head) {
            ListNode fast = head;
            ListNode slow = head;
            while (fast != null && fast.next != null) {
                fast = fast.next.next;
                slow = slow.next;
            }
            return slow;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        Printer.printListNode(solution.middleNode(Generator.create(1, 2, 3, 4, 5)));
        Printer.printListNode(solution.middleNode(Generator.create(1, 2, 3, 4, 5, 6)));
    }
}